package com.ljx.designMode.agency;

/**
 * @author LJX
 * @Description: TODO
 * @Date: 2022/11/9 9:41
 * @Version 1.0
 */

/**
 * 代理模式的主要作用是为其它对象提供一种代理以控制这个对象的访问
 * 在某些情况下，一个对象不想或者不能直接引用另一个对象，
 * 而代理对象可以在客户端和目标对象之间起到中介的作用
 *
 * 静态代理就是写死了在代理对象中执行这个方法前后添加功能的形式，
 * 每次在接口中添加一个新的方法
 * 则需要在目标对象中实现这个方法，
 * 并且在代理对象中实现相应的代理方法
 *
 *
 * 静态代理类的缺点需要客户端自己创建代理类对象，如果接口中增加了一个方法，需要被代理类和代理类也增加该方法
 */
public class StarAgencyTest {
	public static void main(String[] args) {
		StarAgency starAgency = new StarAgency(new Star());
		starAgency.vocalConcert();

	}
}

interface Movie{
	// 抽取的公共功能：目标和代理类

	void vocalConcert();
}

/**
 * 明星类-被代理的对象类
 */
class Star implements Movie{

	@Override
	public void vocalConcert() {
		System.out.println("彭于晏");
	}
}

/**
 * 代理类，不仅可以拥有被代理对象的方法，还可以拥有自己的方法
 *  静态代理就是写死了在代理对象中执行这个方法前后添加功能的形式，
 *  每次在接口中添加一个新的方法
 *  则需要在目标对象中实现这个方法，
 *  并且在代理对象中实现相应的代理方法
 */
class StarAgency implements Movie{

	private Star star;

	public StarAgency(Star star) {
		this.star = star;
	}

	public void A(){
		System.out.println("唱歌");
	}
	@Override
	public void vocalConcert() {
		A();
		this.star.vocalConcert();
		B();
	}

	public void B(){
		System.out.println("跳舞");
	}

}